//
//  GCDViewController.m
//  多线程编程
//
//  Created by Guo Rui on 2017/7/14.
//  Copyright © 2017年 GR Harry. All rights reserved.
//

#import "GCDViewController.h"

@interface GCDViewController (){
    dispatch_queue_t _queue;
}
@property (weak, nonatomic) IBOutlet UILabel *numberLabel;
@property (weak, nonatomic) IBOutlet UIButton *suspendButton;
@property (weak, nonatomic) IBOutlet UIButton *resumeButton;

@end

@implementation GCDViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    self.resumeButton.enabled = NO;
    
    [self dispatch_suspend_resume];
}


- (IBAction)suspendAction:(id)sender {
    self.resumeButton.enabled = YES;
    self.suspendButton.enabled = NO;
    dispatch_suspend(_queue);
}

- (IBAction)resumeAction:(id)sender {
    self.resumeButton.enabled = NO;
    self.suspendButton.enabled = YES;
    dispatch_resume(_queue);
}

// 队列的挂起 和 继续
- (void)dispatch_suspend_resume {
    /*
     我们可以暂停一个 queue 以阻止它执行 block 对象，使用 dispatch_suspend 函数挂起一个 dispatch queue；使用 dispatch_resume 函数继续 dispatch queue。调 用 dispatch_suspend 会增加 queue 的挂起计数，调用 dispatch_resume 则减少queue 的挂起计数。当挂起计数大于 0 时，queue 就保持挂起状态。因此你必须对应地调用 suspend 和 resume 函数。
     
     
     
     挂起和继续是以任务为单位的，suspend暂停的是队列中之后的任务的执行，并不能中断当前正在执行的任务。resume会恢复队列中剩下任务的执行。
     */
    
    dispatch_queue_t queue = dispatch_queue_create("test.serialQueue", DISPATCH_QUEUE_SERIAL);
    _queue = queue;
    
    // 添加多个异步任务
    dispatch_async(queue, ^{
        NSLog(@"任务%@", [NSThread currentThread]);
        
        for (int i = 0; i < 6; i ++) {
            sleep(1);
            dispatch_sync(dispatch_get_main_queue(), ^{
                self.numberLabel.text = @(i).stringValue;
            });
        }
        
        NSLog(@"任务结束");
    });
    
    dispatch_async(queue, ^{
        NSLog(@"任务二执行了");
    });
}



@end
